package ch03
{
	import ch03.com.friendsofed.isometric.DrawnIsoBox;
	import ch03.com.friendsofed.isometric.DrawnIsoTile;
	import ch03.com.friendsofed.isometric.GraphicTile;
	import ch03.com.friendsofed.isometric.IsoUtils;
	import ch03.com.friendsofed.isometric.IsoWorld;
	import ch03.com.friendsofed.isometric.Point3D;

	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.MouseEvent;
	import flash.geom.Point;

	/**
	 * 使用外部图形测试
	 *
	 * 回来看问题：两个偏移量是怎么得来的？嗯，由于我们都是以中心点作为 tile 的注册点
	   来创建图形的，换句话说，把一个tile 放于屏幕的中心位置，只要设置tile 的(x,y)为屏幕的中
	   心点即可。
	   但是当图形是被嵌入的，或是别的什么实例，再被加入显示列表后，此时的注册点是左
	   上角，它们会偏右和偏下。所以要把 tile 的注册点向左和向上偏移到中心位置。第一个 tile
	   是40x20 的大小，所以要让它居中，就得向左偏移20，向上偏移10。另一个稍微复杂点，向
	   右偏移20 没什么问题，但向上则偏移了30，这是因为该点看上去才是正方体底面的中心点。
	 */
	[SWF(backgroundColor=0xffffff)]
	public class GraphicTest extends Sprite
	{
		private var world:IsoWorld;

		[Embed(source="../../assets/tile_01.png")]
		private var Tile01:Class;

		[Embed(source="../../assets/tile_02.png")]
		private var Tile02:Class;

		public function GraphicTest()
		{
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;

			world = new IsoWorld();
			world.x = stage.stageWidth / 2;
			world.y = 100;
			addChild(world);

			for (var i:int = 0; i < 20; i++)
			{
				for (var j:int = 0; j < 20; j++)
				{
					var tile:GraphicTile = new GraphicTile(20, Tile01, 20, 10);
					tile.position = new Point3D(i * 20, 0, j * 20);
					var tile2:DrawnIsoTile = new DrawnIsoTile(20, 0xFF0000);
					tile2.position = new Point3D(i * 20, 0, j * 20);
					world.addChildToFloor(tile);
					world.addChildToFloor(tile2);
				}
			}
			stage.addEventListener(MouseEvent.CLICK, onWorldClick);
		}

		private function onWorldClick(event:MouseEvent):void
		{
			var box:GraphicTile = new GraphicTile(20, Tile02, 20, 30);
			var pos:Point3D = IsoUtils.screenToIso(new Point(world.mouseX, world.mouseY));
			pos.x = Math.round(pos.x / 20) * 20;
			pos.y = Math.round(pos.y / 20) * 20;
			pos.z = Math.round(pos.z / 20) * 20;
			box.position = pos;
			world.addChildToWorld(box);
		}
	}
}